/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package tela.edsc;

import ferramentas.CFG;
import ferramentas.Comunicacao;
import ferramentas.DataUtil;
import ferramentas.FileUtil;
import ferramentas.MultipartFormHandler;
import ferramentas.Query;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.activation.UnsupportedDataTypeException;
import javax.mail.MessagingException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;

/**
 *
 * @author Lauro
 */
public class formularioDireitosSociais extends HttpServlet {

    private String email;
    private String nome;
    private String cpf;
    private int id;
    private String paginaInicial = "http://www.goias.ufg.br";
    private String emailAdministrador = "rosa-cassia06@hotmail.com";

    /**
     * Processes requests for both HTTP
     * <code>GET</code> and
     * <code>POST</code> methods.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException, MessagingException {
        response.setContentType("text/html;charset=UTF-8");
        request.setCharacterEncoding("UTF-8");
        response.setCharacterEncoding("UTF-8");
        PrintWriter out = response.getWriter();
        try {
            
            Date inicioInscricoes = DataUtil.converterData(CFG.INICIO_INRICOES_EDSC, DataUtil.DataFormat.DDMMAAAAHHMM);
            Date finalInscricoes = DataUtil.converterData(CFG.FIM_INRICOES_EDSC, DataUtil.DataFormat.DDMMAAAAHHMM);
            Date agora = new Date();

            if (agora.after(finalInscricoes) || agora.before(inicioInscricoes)) {
                throw new UnsupportedDataTypeException();
            } else {
                MultipartFormHandler form = new MultipartFormHandler(8*CFG.MAX_UPLOAD_FORMULARIOS);

                if (form.isMultipart(request)) {
                    out.println("<html>");
                    out.println("<head>");
                    out.println("<title>Ficha de Inscrição</title>");
                    out.println("</head>");
                    out.println("<body>");
                    out.println("Aguarde...<br /><br />");

                    cpf = form.getParameter("cpf");
                    String cpfLimpo = cpf.replaceAll("\\.", "");
                    cpfLimpo = cpfLimpo.replaceAll("-", "");

                    Query q = new Query();

                    boolean isCadastrado = false;
                    if (!cpf.isEmpty()) {
                        isCadastrado = q.isUsuarioCadastradoEDSC(cpf);
                    }

                    if (!isCadastrado) {
                        // == INFORMAÇÕES PESSOAIS
                        nome = form.getParameter("nome");
                        // == ENDEREÇO
                        String endereco = form.getParameter("endereco");
                        String bairro = form.getParameter("bairro");
                        String cep = form.getParameter("cep");
                        String cidade = form.getParameter("cidade");
                        String estado = form.getParameter("estado");

                        // == CONTATO
                        String telefone1 = form.getParameter("telefone1");
                        String telefone2 = form.getParameter("telefone2");
                        String celular = form.getParameter("celular");
                        email = form.getParameter("email");

                        // == FILIAÇÃO E DADOS PESSOAIS NASCIMENTO
                        String pai = form.getParameter("pai");
                        String mae = form.getParameter("mae");
                        Date nascimento = DataUtil.converterData(form.getParameter("nascimento"), DataUtil.DataFormat.DDMMAAAA);

                        String sexo = form.getParameter("sexo");
//                        String cidadenasc = form.getParameter("cidadenasc");
//                        String estadonasc = form.getParameter("estadonasc");
//                        String pais = form.getParameter("pais");
                        String nacionalidade = form.getParameter("nacionalidade");
                        String estado_civil = form.getParameter("estado_civil");
//                        if (estadocivil.equalsIgnoreCase("outros")) {
//                            estadocivil = form.getParameter("estadociviloutros");
//                        }

                        /// == DADOS REGISTRO
                        String rg = form.getParameter("rg");
                        String uf_rg = form.getParameter("uf_rg");
//                        String emissoridentidade = form.getParameter("emissoridentidade");
                        Date emissao_rg = DataUtil.converterData(form.getParameter("emissao_rg"), DataUtil.DataFormat.DDMMAAAA);
                        // Título
                        String titulo = form.getParameter("titulo");
                        String uf_titulo = form.getParameter("uf_titulo");
                        String zona_titulo = form.getParameter("zona_titulo");
                        String secao_titulo = form.getParameter("secao_titulo");
                        Date emissao_titulo = DataUtil.converterData(form.getParameter("emissao_titulo"), DataUtil.DataFormat.DDMMAAAA);

                        // == FORMAÇÃO
                        String instituicao_formacao = form.getParameter("instituicao_formacao");
                        String titulo_formacao = form.getParameter("titulo_formacao");
                        String especialidade_formacao = form.getParameter("especialidade_formacao");
                        Date inicio_formacao = DataUtil.converterData(form.getParameter("inicio_formacao"), DataUtil.DataFormat.MMAAAA);
                        Date termino_formacao = DataUtil.converterData(form.getParameter("termino_formacao"), DataUtil.DataFormat.MMAAAA);

                        // == LATTES
                        String linklattes = form.getParameter("linklattes");
                        // == CHECKBOXES
                        boolean li_edital = form.getParameter("li_edital") != null;

                        // == COMPROVANTES
                        String caminhoArquivo;
                        
                        // Salvar copia_rg
                        FileItem copia_rg = form.getFile("copia_rg");
                        String arquivoCopiaRG = null;
                        if (copia_rg != null && copia_rg.getSize() > 0) {
                            caminhoArquivo = getPastaDocumentos() + CFG.EDSC_RG;
                            FileUtil.gravarArquivoComExtensao(copia_rg, caminhoArquivo, cpfLimpo);
                            arquivoCopiaRG = cpfLimpo + FileUtil.getExtensaoArquivo(copia_rg.getName());
                        }

                        // Salvar copia_cpf
                        FileItem copia_cpf = form.getFile("copia_cpf");
                        String arquivoCopiaCPF = null;
                        if (copia_cpf != null && copia_cpf.getSize() > 0) {
                            caminhoArquivo = getPastaDocumentos() + CFG.EDSC_CPF;
                            FileUtil.gravarArquivoComExtensao(copia_cpf, caminhoArquivo, cpfLimpo);
                            arquivoCopiaCPF = cpfLimpo + FileUtil.getExtensaoArquivo(copia_cpf.getName());
                        }

                        // Salvar copia_visto, caso não receba nenhum arquivo o mesmo escreve que não recebeu nada no banco de dados.
                        FileItem copia_visto = form.getFile("copia_visto");
                        String arquivoCopiaVisto = null;
                        if (copia_visto != null && copia_visto.getSize() > 0) {
                            caminhoArquivo = getPastaDocumentos() + CFG.EDSC_VISTO;
                            FileUtil.gravarArquivoComExtensao(copia_visto, caminhoArquivo, cpfLimpo);
                            arquivoCopiaVisto = cpfLimpo + FileUtil.getExtensaoArquivo(copia_visto.getName());
                        }
                        
                        String graduacao = form.getParameter("comprovante_formacao");

                        String arquivoCopiaDiploma = null;
                        String arquivoCopiaComprovante = null;
                        if (graduacao.equals("graduado")) { // GRADUADO
                            // Salvar copia_diploma
                            FileItem copia_diploma = form.getFile("copia_diploma");
                            if (copia_diploma != null && copia_diploma.getSize() > 0) {
                                caminhoArquivo = getPastaDocumentos() + CFG.EDSC_DIPLOMA;
                                FileUtil.gravarArquivoComExtensao(copia_diploma, caminhoArquivo, cpfLimpo);
                                arquivoCopiaDiploma = cpfLimpo + FileUtil.getExtensaoArquivo(copia_diploma.getName());
                            }
                        } else { // GRADUANDO
                            FileItem copia_comprovante = form.getFile("copia_comprovante");
                            if (copia_comprovante != null && copia_comprovante.getSize() > 0) {
                                caminhoArquivo = getPastaDocumentos() + CFG.EDSC_COMPROVANTE;
                                FileUtil.gravarArquivoComExtensao(copia_comprovante, caminhoArquivo, cpfLimpo);
                                arquivoCopiaComprovante = cpfLimpo + FileUtil.getExtensaoArquivo(copia_comprovante.getName());
                            }
                        }
                        
                        FileItem copia_declaracao = form.getFile("declaracao");
                        String arquivoDeclaracao = null;
                        if (copia_declaracao != null && copia_declaracao.getSize() > 0) {
                            caminhoArquivo = getPastaDocumentos() + CFG.EDSC_DECLARACAO;
                            FileUtil.gravarArquivoComExtensao(copia_declaracao, caminhoArquivo, cpfLimpo);
                            arquivoDeclaracao = cpfLimpo + FileUtil.getExtensaoArquivo(copia_declaracao.getName());
                        }
                        FileItem contracheque = form.getFile("contracheque");
                        String arquivoContraCheque = null;
                        if (contracheque != null && contracheque.getSize() > 0) {
                            caminhoArquivo = getPastaDocumentos() + CFG.EDSC_CONTRACHEQUE;
                            FileUtil.gravarArquivoComExtensao(contracheque, caminhoArquivo, cpfLimpo);
                            arquivoContraCheque = cpfLimpo + FileUtil.getExtensaoArquivo(contracheque.getName());
                        }
                        FileItem copia_projeto = form.getFile("projeto");
                        String arquivoProjeto = null;
                        if (copia_projeto != null && copia_projeto.getSize() > 0) {
                            caminhoArquivo = getPastaDocumentos() + CFG.EDSC_PROJETO;
                            FileUtil.gravarArquivoComExtensao(copia_projeto, caminhoArquivo, cpfLimpo);
                            arquivoProjeto = cpfLimpo + FileUtil.getExtensaoArquivo(copia_projeto.getName());
                        }
                        FileItem declaracao_motivacao = form.getFile("motivacao");
                        String arquivoMotivacao = null;
                        if (declaracao_motivacao != null && declaracao_motivacao.getSize() > 0) {
                            caminhoArquivo = getPastaDocumentos() + CFG.EDSC_MOTIVACAO;
                            FileUtil.gravarArquivoComExtensao(declaracao_motivacao, caminhoArquivo, cpfLimpo);
                            arquivoMotivacao = cpfLimpo + FileUtil.getExtensaoArquivo(declaracao_motivacao.getName());
                        }

                        id = q.cadastraEDSC(getSQL(),
                                nome, endereco, bairro, cep, cidade, estado,
                                telefone1, telefone2, celular, email, pai, mae, 
                                nascimento, sexo, nacionalidade, estado_civil, 
                                rg, uf_rg, emissao_rg, cpf, titulo, uf_titulo,
                                zona_titulo, secao_titulo, emissao_titulo, 
                                instituicao_formacao, titulo_formacao, especialidade_formacao, 
                                inicio_formacao, termino_formacao, linklattes, 
                                li_edital, arquivoCopiaRG, arquivoCopiaCPF,
                                arquivoCopiaVisto, graduacao, arquivoCopiaDiploma, 
                                arquivoCopiaComprovante, arquivoDeclaracao, arquivoContraCheque, arquivoProjeto, arquivoMotivacao);

                        out.println("Inscrição realizada com sucesso!.<br /> <a href='" + paginaInicial + "'> Voltar à página do curso.</a>");
                        out.println("<script>");
                        out.println("window.alert('Inscrição realizada com sucesso!');");
                        out.println("self.location ='" + paginaInicial + "';");
                        out.println("</script>");
                        enviarEmailConfirmacao();
                    } else {
                        out.println("ERRO na inscrição! Usuário já está inscrito! <a href='" + paginaInicial + "'> Voltar à página do curso.</a>");
                        out.println("<script>");
                        out.println("window.alert('Usuário já está inscrito!');");
                        out.println("self.location ='" + paginaInicial + "';");
                        out.println("</script>");
                        String mensagem = new Date() + " - CPF: " + cpf + "\r\n ->Usuário já está inscrito!";
                        System.out.println(mensagem);
                        enviarEmailProblema(mensagem);
                    }
                } else {
                    out.println("ERRO na inscrição! <a href='" + paginaInicial + "'> Voltar à página do curso.</a>");
                    out.println("<script>window.alert('Erro ao enviar arquivos!');history.go(-1);</script>");
                    String mensagem = new Date() + " - CPF: " + cpf + " - Nome: " + nome + "\r\n ->Erro ao enviar arquivos! Formulário não é MULTIPART!";
                    System.out.println(mensagem);
                    enviarEmailProblema(mensagem);
                }
            }
        } catch (UnsupportedDataTypeException ex) {
            out.println("<script>");
            out.println("window.alert('Não é possível se inscrever nesse curso! Fora do prazo de inscrição!');");
            out.println("self.location ='" + paginaInicial + "';");
            out.println("</script>");
            out.println("Não é possível se inscrever nesse curso!  Fora do prazo de inscrição!<br /><a href='" + paginaInicial + "'> Voltar à página do curso.</a>");
            String mensagem = new Date() + " - CPF: " + cpf + " - Nome: " + nome + "\r\n ->Não é possível se inscrever nesse curso!  Fora do prazo de inscrição!";
            System.out.println(mensagem + "\n" + ex);
            enviarEmailProblema(mensagem + "<br /><em>" + ex + "</em>");
        } catch (Exception ex) {
            out.println("<script>");
            out.println("window.alert('Erro ao cadastrar! Entre em contato com Suporte para tentar resolver o seu problema.');");
            out.println("self.location ='" + paginaInicial + "';");
            out.println("</script>");
            out.println("ERRO na inscrição! <a href='" + paginaInicial + "'> Voltar à página do curso.</a>");
            String mensagem = new Date() + " - CPF: " + cpf + " - Nome: " + nome + "\r\n ->" + ex;
            System.out.println(mensagem + "\n" + ex);
            enviarEmailProblema(mensagem + "<br /><em>" + ex + "</em>");
        } finally {
            out.println("</body>");
            out.println("</html>");
            out.close();
        }

    }

    private String getPastaDocumentos() {
        String root = getServletContext().getRealPath("/");
//        String localDocumentos = "C:\\teste\\" + CFG.DIRETORIO_ARQUIVOS
        String localDocumentos = "/var/lib/tomcat6/webapps/" + CFG.DIRETORIO_ARQUIVOS
                + System.getProperty("file.separator") + CFG.DIRETORIO_DOCUMENTOS
                + System.getProperty("file.separator") + CFG.DIRETORIO_DOCUMENTOS_EDSC;
        return localDocumentos + System.getProperty("file.separator");
    }

    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /**
     * Handles the HTTP
     * <code>GET</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
    }

    /**
     * Handles the HTTP
     * <code>POST</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        try {
            processRequest(request, response);
        } catch (MessagingException ex) {
            Logger.getLogger(formularioDireitosSociais.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    /**
     * Returns a short description of the servlet.
     *
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>

    // <editor-fold defaultstate="collapsed" desc="SQL">
    public String getSQL() {
        return "INSERT INTO bridge.edsc_2013 ("
                + " nome, "
                + " endereco, "
                + " bairro, "
                + " cep, "
                + " cidade, "
                + " estado, "
                + " telefone1, "
                + " telefone2, "
                + " celular, "
                + " email, "
                + " pai, "
                + " mae, "
                + " nascimento, "
                + " sexo, "
                + " nacionalidade, "
                + " estado_civil, "
                + " rg, "
                + " uf_rg, "
                + " emissao_rg, "
                + " cpf, "
                + " titulo, "
                + " uf_titulo, "
                + " zona_titulo, "
                + " secao_titulo, "
                + " emissao_titulo, "
                + " instituicao_formacao, "
                + " titulo_formacao, "
                + " especialidade_formacao, "
                + " inicio_formacao, "
                + " termino_formacao, "
                + " linklattes, "
                + " li_edital, "
                + " arquivo_copia_rg, "
                + " arquivo_copia_cpf, "
                + " arquivo_copia_visto, "
                + " graduacao, "
                + " arquivo_copia_diploma, "
                + " arquivo_copia_comprovante, "
                + " arquivo_copia_declaracao, "
                + " arquivo_copia_contracheque, "
                + " arquivo_copia_projeto, "
                + " arquivo_motivacao, "
                + " data_inscricao "
                + " ) VALUES (  "
                + " ?,  "
                + " ?,  "
                + " ?,  "
                + " ?,  "
                + " ?,  "
                + " ?,  "
                + " ?,  "
                + " ?,  "
                + " ?,  "
                + " ?,  "
                + " ?,  "
                + " ?,  "
                + " ?,  "
                + " ?,  "
                + " ?,  "
                + " ?,  "
                + " ?,  "
                + " ?,  "
                + " ?,  "
                + " ?,  "
                + " ?,  "
                + " ?,  "
                + " ?,  "
                + " ?,  "
                + " ?,  "
                + " ?,  "
                + " ?,  "
                + " ?,  "
                + " ?,  "
                + " ?,  "
                + " ?,  "
                + " ?,  "
                + " ?,  "
                + " ?,  "
                + " ?,  "
                + " ?,  "
                + " ?,  "
                + " ?,  "
                + " ?,  "
                + " ?,  "
                + " ?,  "
                + " ?,  "
                + " ?  "
                +" )";
    }
    // </editor-fold>

    private void enviarEmailProblema(String mensagem) {
        try {
            Comunicacao c = new Comunicacao();
            String assunto = "Erro no envio de formulário ESPECIALIZAÇÃO DE DIREITOS SOCIAIS DO CAMPO";
            c.enviarEmail(CFG.EMAIL_ADMINISTRADORES, assunto, mensagem, "noreply@ciar.ufg.br");
        } catch (MessagingException ex) {
        }
    }

    private void enviarEmailConfirmacao() {
        try {
            Comunicacao c = new Comunicacao();
            String mensagem = "Olá, " + nome + ".<br /><br />Sua inscrição no <strong>CURSO DE ESPECIALIZAÇÃO DE DIREITOS SOCIAIS DO CAMPO</strong>, oferecido pela Universidade Federal de Goiás, de número <strong>" + id + "</strong>, foi confirmada.";
            String assunto = "Confirmação de inscrição para o curso de ESPECIALIZAÇÃO DE DIREITOS SOCIAIS DO CAMPO";
            c.enviarEmail(new String[]{email, emailAdministrador}, assunto, mensagem, "noreply@ciar.ufg.br");
        } catch (MessagingException ex) {
            System.out.println(new Date() + " - CPF: " + cpf + " - Erro ao enviar e-mail de confirmação de inscrição.");
        }
    }
}
